package cn.touna.jss.common.util;

import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;

import java.io.InputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 通用工具类
 *
 * @author XUZIMING 2016-10-11
 */
public class CommonUtils {

    public static final String UTF8 = "UTF-8";

    /**======================================================================================*/
    /**================================= 字符/数组等非空判断与操作=================================*/
    /**
     * ======================================================================================
     */

    public static boolean isEmpty(String input) {
        return input == null || input.trim().isEmpty();
    }

    public static boolean isEmptyContainNull(String input) {
        return input == null || input.trim().isEmpty() || input.trim().equalsIgnoreCase("null");
    }

    public static boolean isEmpty(Object[] array) {
        return array == null || array.length == 0;
    }

    public static boolean isEmpty(Collection<?> c) {
        return c == null || c.isEmpty();
    }

    public static boolean isEmpty(Map<?, ?> map) {
        return map == null || map.isEmpty();
    }

    /**======================================================================================*/
    /**==================================== 字符相等或不等判断 ===================================*/
    /**======================================================================================*/

    /**
     * 判断两个字符串是否相同(区别于: ==)
     *
     * @param input1 字符串1
     * @param input2 字符串2
     * @return
     */
    public static boolean equals(String input1, String input2) {
        return StringUtils.equals(input1, input2);
    }


    /**======================================================================================*/
    /**======================================基本类型转换  ======================================*/
    /**
     * ======================================================================================
     */

    public static int parseInt(Object data) {
        return parseInt(data, 0);
    }

    public static short parseShort(Object data) {
        if (data != null) {
            try {
                return (data instanceof Short) ?
                        ((Short) data).shortValue() : Short.valueOf(String.valueOf(data));
            } catch (Exception e) {
            }
        }
        return 0;
    }

    public static int parseInt(Object data, int def) {
        if (data != null) {
            if (data instanceof Integer)
                return (Integer) data;
        }
        if (data != null) {
            try {
                return (data instanceof Integer) ?
                        ((Integer) data).intValue() : Integer.parseInt(String.valueOf(data));
            } catch (Exception e) {
            }
        }
        return def;
    }

    public static long parseLong(Object data, long def) {
        if (data != null) {
            try {
                return (data instanceof Long) ? ((Long) data).longValue() : Long.parseLong(String.valueOf(data));
            } catch (Exception e) {
            }
        }
        return def;
    }

    public static double parseDouble(Object data) {
        return parseDouble(data, (double) 0);
    }

    public static double parseDouble(Object data, double def) {
        if (data != null) {
            try {
                double value = def;
                if (data instanceof BigDecimal) {
                    value = ((BigDecimal) data).doubleValue();
                } else if (data instanceof Double) {
                    value = ((Double) data).doubleValue();
                } else {
                    value = Double.valueOf(String.valueOf(data));
                }
                return value == 0 ? 0 : roundHalfUp(value, 2);
            } catch (Exception e) {
            }
        }
        return def;
    }

    public static double roundHalfUp(double value, int scale) {
        BigDecimal decimal = new BigDecimal(value);
        return decimal.setScale(scale, BigDecimal.ROUND_HALF_EVEN).doubleValue();
    }

    public static byte[] toBinary(String content) {
        try {
            return content.getBytes(UTF8);
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException("不支持的编码类型:" + UTF8);
        }
    }

    public static String toString(byte[] data) {
        try {
            return new String(data, UTF8);
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException("不支持的编码类型:" + UTF8);
        }
    }

    /**======================================================================================*/
    /**====================================集合/数组/Map操作====================================*/
    /**
     * ======================================================================================
     */

    public static int size(Collection<?> c) {
        return c == null ? 0 : c.size();
    }


    @SuppressWarnings("unchecked")
    public static <T> T getValue(Map<String, ?> dataMap, String key) {
        Object value = dataMap.get(key);
        return value == null ? null : (T) value;
    }


    /**======================================================================================*/
    /**=====================================异常定义与处理 ======================================*/
    /**
     * ======================================================================================
     */

    public static IllegalStateException illegalStateException(Throwable t) {
        return new IllegalStateException(t);
    }

    public static String getErrorMessage(Throwable e){
        if(!StringUtils.isNotBlank(e.getMessage()))
            return e.getMessage();
        if(e.getCause() != null){
            return e.getCause().toString();
        }
        return formatThrowable(e);
    }

    /**
     * 格式化异常
     *
     * @param t
     * @return
     */
    public static String formatThrowable(Throwable t) {
        if (t == null) return "";
        StringWriter sw = new StringWriter();
        PrintWriter pw = new PrintWriter(sw);
        t.printStackTrace(pw);
        pw.flush();
        sw.flush();
        return sw.toString();
    }

    public static String formatThrowableForHtml(Throwable t) {
        String ex = formatThrowable(t);
        return ex.replaceAll("\n\t", " ");
    }

    /**======================================================================================*/
    /**======================================反射/实例化 =======================================*/
    /**======================================================================================*/

    /**
     * 实例化对象,注意该对象必须有无参构造函数
     *
     * @param klass
     * @return
     */
    public static <T> T newInstance(Class<T> klass) {
        try {
            return (T) klass.newInstance();
        } catch (Exception e) {
            throw new IllegalArgumentException("instance class[" + klass + "] with ex:", e);
        }
    }

    @SuppressWarnings("unchecked")
    public static <T> T newInstance(String className) {
        try {
            return (T) newInstance(Class.forName(className));
        } catch (Exception e) {
            throw new IllegalArgumentException("instance class[" + className + "] with ex:", e);
        }
    }

    public static Class<?> classForName(String className) {
        try {
            return Class.forName(className);
        } catch (Exception e) {
            throw new IllegalArgumentException("classForName(" + className + ")  with ex:", e);
        }
    }

    /**======================================================================================*/
    /**====================================== URL编/解码 ======================================*/
    /**
     * ======================================================================================
     */

    public static String urlDecodeUTF8(String input) {
        if (input == null) return null;
        try {
            return URLDecoder.decode(input, UTF8);
        } catch (Exception e) {
            throw illegalStateException(e);
        }
    }

    public static String urlEncodeUTF8(String input) {
        if (input == null) return null;
        try {
            return URLEncoder.encode(input, UTF8);
        } catch (Exception e) {
            throw illegalStateException(e);
        }
    }

    /**======================================================================================*/
    /**==================================classpath下文件读取 ===================================*/
    /**
     * ======================================================================================
     */

    public static InputStream getInputStreamFromClassPath(String filename) {
        return CommonUtils.isEmpty(filename) ? null :
                CommonUtils.class.getClassLoader().getResourceAsStream(filename);
    }

    /**======================================================================================*/
    /**====================================HTML字符内容操作=====================================*/
    /**======================================================================================*/

    /**
     * 过滤html标签和部分特殊字符
     *
     * @param content
     * @return
     */
    public static String filterHtml(String content) {
        if (CommonUtils.isEmpty(content)) return "";

        Map<String, String> regs = new HashMap<String, String>();
        regs.put("<([^>]*)>", "");
        regs.put("(&nbsp;)", " ");
        regs.put("(&apos;)", "'");
        regs.put("(&quot;)", "\"");
        regs.put("(&ldquo;)", "“");
        regs.put("(&rdquo;)", "”");
        regs.put("(&lt;)", "<");
        regs.put("(&gt;)", ">");
        regs.put("(&ndash;)", "-");

        Pattern p = null;
        Matcher m = null;
        for (Map.Entry<String, String> entry : regs.entrySet()) {
            p = Pattern.compile(entry.getKey(), Pattern.CASE_INSENSITIVE); // 横杠
            m = p.matcher(content);
            content = m.replaceAll(entry.getValue());
        }

        return content;
    }

    /**
     * 兼容旧数据
     *
     * @param str
     * @return
     */
    @Deprecated
    public static String replaceHref(String str) {
        if (str == null) return null;
        String firstStr = "<a href='/invest/a", lastStr = ".html' target=_blank>";
        String firstReplace = "<a href='/invest-page.html?id=", lastReplace = "' target=_blank>";
        int first = str.indexOf(firstStr);
        if (first >= 0) {
            str = str.replaceAll(firstStr, firstReplace);
            str = str.replaceAll(lastStr, lastReplace);
        }
        return str;
    }

    /**======================================================================================*/
    /**=======================================文件路径解析======================================*/
    /**======================================================================================*/

    /**
     * 将文件路径转换为Java可识别的路径
     *
     * @param path 文件路径
     * @return
     */
    public static String castToJavaFilePath(String path) {
        String FILE_SEPERATOR = "/";

        if (path == null) return null;

        // 反斜杠
        path = StringUtils.replace(path, "\\", FILE_SEPERATOR);
        path = StringUtils.replace(path, "\\\\", FILE_SEPERATOR);

        // 斜杠
        path = StringUtils.replace(path, "//", FILE_SEPERATOR);
        path = StringUtils.replace(path, "////", FILE_SEPERATOR);
        path = StringUtils.replace(path, "//////", FILE_SEPERATOR);
        path = StringUtils.replace(path, "////////", FILE_SEPERATOR);

        path = StringUtils.replace(path, "/", FILE_SEPERATOR);
        path = StringUtils.replace(path, "//", FILE_SEPERATOR);
        path = StringUtils.replace(path, "///", FILE_SEPERATOR);
        path = StringUtils.replace(path, "////", FILE_SEPERATOR);

        path = StringUtils.replace(path, "${FILE_SEPERATOR}", FILE_SEPERATOR);

        return path;
    }

    /**
     * java去除字符串中的空格、回车、换行符、制表符
     *
     * @param str
     * @return
     */
    public static String replaceBlank(String str) {
        // String dest = "";
        // if (str != null) {
        // Pattern p = Pattern.compile("\\s*|\t|\r|\n");
        // Matcher m = p.matcher(str);
        // dest = m.replaceAll("");
        // }
        // return dest;

        return StringUtils.deleteWhitespace(str);
    }

    /**
     * 以特定的字符拼接字符串
     *
     * @param separator 连接字符
     * @param values
     * @return
     */
    public static String contactStr(String separator, String... values) {
//		if (null == values || 0 >= values.length) {
//			return null;
//		}
//		StringBuffer sb = new StringBuffer("");
//		for (String value : values) {
//			sb.append(value).append(str);
//		}
//		return sb.substring(0, sb.length() - 1).toString();

        return StringUtils.join(values, separator);
    }


    public static void main(String[] args) {

        String tel = "07381875399";
        tel = tel.replace("-", "").replaceAll("\\d(?=\\d{4})", "*");
        System.out.print(tel);
    }
}
